// 父类
abstract class AbstractClass {
    // 模板方法
    templateMethod() {
      this.operation1();
      this.operation2();
    }
  
    // 具体方法
    operation1() {
      console.log('AbstractClass.operation1');
    }
  
    // 抽象方法
    abstract operation2(): void;
  }
  
  // 子类1
  class ConcreteClass1 extends AbstractClass {
    operation2() {
      console.log('ConcreteClass1.operation2');
    }
  }
  
  // 子类2
  class ConcreteClass2 extends AbstractClass {
    operation2() {
      console.log('ConcreteClass2.operation2');
    }
  }
  
  // 客户端代码
  const concreteClass1 = new ConcreteClass1();
  concreteClass1.templateMethod();
  
  const concreteClass2 = new ConcreteClass2();
  concreteClass2.templateMethod();